package org.csu.onlineedubackend.service;

import com.baomidou.mybatisplus.extension.service.IService;
import org.csu.onlineedubackend.dto.*;
import org.csu.onlineedubackend.entity.User;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 用户服务接口
 */
public interface UserService extends IService<User> {
    /**
     * 用户登录
     * @param loginDTO 登录信息
     * @return 登录结果
     */
    Map<String, Object> login(LoginDTO loginDTO);

    /**
     * 根据手机号登录
     * @param phone 手机号
     * @param smsCode 短信验证码
     * @return 登录结果
     */
    Map<String, Object> loginByPhone(String phone, String smsCode);

    /**
     * 根据手机号获取用户
     * @param phone 手机号
     * @return 用户对象
     */
    User getUserByPhone(String phone);

    /**
     * 根据用户名获取用户
     * @param username 用户名
     * @return 用户对象
     */
    User getUserByUsername(String username);
    
    /**
     * 检查用户名是否已存在
     * @param username 用户名
     * @return 是否存在
     */
    boolean checkUsernameExists(String username);
    
    /**
     * 检查手机号是否已存在
     * @param phone 手机号
     * @return 是否存在
     */
    boolean checkPhoneExists(String phone);
    
    /**
     * 注册用户
     * @param registerDTO 注册信息
     * @return 注册结果
     */
    Map<String, Object> register(RegisterDTO registerDTO);
    
    /**
     * 验证认证码
     * @param authCode 认证码
     * @return 角色代码，-1表示无效
     */
    int validateAuthCode(String authCode);

    void updateFaceRegisteredStatus(Integer userId, boolean status);

    Map<String, Object> loginById(Integer userId);

    Map<String, Object> phoneLogin(PhoneLoginDTO phoneLoginDTO);

    // 添加获取所有用户的方法
    List<User> list();

    /**
     * 获取学生统计数据
     * @return 学生统计数据
     */
    Map<String, Object> getStudentStats();

    Map<String, Object> getTeacherStats();

    /**
     * 获取每月注册学生数
     * @return 每月注册学生数列表，包含月份和人数
     */
    List<Map<String, Object>> getMonthlyRegisteredStudents();

    PageResponseDTO<StudentListDTO> getStudentPage(int page, int size, String sortField);
    PageResponseDTO<TeacherListDTO> getTeacherPage(int page, int size);

    // 获得排名前三的学生
    List<StudentListDTO> getTopStudents(String sort, int limit);

    Map<Integer, String> getUserNamesByIds(Set<Integer> userIds);

    TeacherDetailDTO getTeacherDetail(Integer teacherId);

    // 获得学生详细信息
    StudentDetailDTO getStudentDetail(Integer studentId);
}
